package Interfaces;

import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.List;
import javax.swing.DefaultComboBoxModel;
import javax.swing.JOptionPane;
import lemar.ConexionHibernate;
import lemar.entidad.Proveedor;
import lemar.entidad.Usuario;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;

public class ModificarUsuario extends javax.swing.JPanel {
    //Atributos para el uso de Hibernate

    private static SessionFactory sessionFactory = null;
    //Para limitar el numero de caracteres de un campo de texto
    private int limite = 8;
    private int limite1 = 15;
    //Para guardar el id del proveedor
    private long id;
       public ModificarUsuario() {
        initComponents();

        //Se carga el comboBox Dinamicamente de la BD
        cargarComboBox();

        //Limitando el numero de caracteres
        txtNuevoNombreUsuario.addKeyListener(new KeyListener(){ 
            public void keyTyped(KeyEvent e)
                {if (txtNuevoNombreUsuario.getText().length()== limite1)
                     e.consume();
                } 
            public void keyPressed(KeyEvent arg0) {
                }
            public void keyReleased(KeyEvent arg0) {
                }
            });
        txtContraseña.addKeyListener(new KeyListener(){ 
            public void keyTyped(KeyEvent e)
                {if (txtContraseña.getText().length()== limite)
                     e.consume();
                } 
            public void keyPressed(KeyEvent arg0) {
                }
            public void keyReleased(KeyEvent arg0) {
                }
            });
        
        //Por default estaran desabilitados por si quiere ingresar datos sin haber seleccionado un usuario alguno
        txtNuevoNombreUsuario.setEditable(false);
        txtContraseña.setEditable(false);
        cmbTipoUsuario.setEnabled(false);

        //Agregando mensajes de ayuda para el llenado de los campos
        txtNuevoNombreUsuario.setToolTipText("Ingrese el nombre del Usuario");
        txtContraseña.setText("");
        txtContraseña.setToolTipText("Ingrese la contraseña del usuario");
        cmbTipoUsuario.setToolTipText("Seleccione el Rol del Usuario");
    }

    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        jLabel1 = new javax.swing.JLabel();
        jLabel2 = new javax.swing.JLabel();
        cmbNombreUsuario = new javax.swing.JComboBox();
        jSeparator1 = new javax.swing.JSeparator();
        jLabel3 = new javax.swing.JLabel();
        txtNuevoNombreUsuario = new javax.swing.JTextField();
        jLabel4 = new javax.swing.JLabel();
        Rol = new javax.swing.JLabel();
        btnModificarUsuario = new javax.swing.JButton();
        btnCancelar = new javax.swing.JButton();
        txtContraseña = new javax.swing.JPasswordField();
        cmbTipoUsuario = new javax.swing.JComboBox();

        setBackground(new java.awt.Color(255, 255, 255));
        setMaximumSize(new java.awt.Dimension(747, 435));
        setMinimumSize(new java.awt.Dimension(747, 435));
        setPreferredSize(new java.awt.Dimension(747, 435));

        jLabel1.setFont(new java.awt.Font("Tahoma", 0, 18)); // NOI18N
        jLabel1.setText("Actualizar Datos De Usuario");

        jLabel2.setText("Nombre Del Usuario");

        cmbNombreUsuario.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "Item 1", "Item 2", "Item 3", "Item 4" }));
        cmbNombreUsuario.addItemListener(new java.awt.event.ItemListener() {
            public void itemStateChanged(java.awt.event.ItemEvent evt) {
                cmbNombreUsuarioItemStateChanged(evt);
            }
        });
        cmbNombreUsuario.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                cmbNombreUsuarioActionPerformed(evt);
            }
        });

        jLabel3.setText("Nuevo Nombre Del Usuario");

        txtNuevoNombreUsuario.addKeyListener(new java.awt.event.KeyAdapter() {
            public void keyTyped(java.awt.event.KeyEvent evt) {
                txtNuevoNombreUsuarioKeyTyped(evt);
            }
        });

        jLabel4.setText("Contraseña");

        Rol.setText("Rol");

        btnModificarUsuario.setText("Modificar");
        btnModificarUsuario.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnModificarUsuarioActionPerformed(evt);
            }
        });

        btnCancelar.setText("Cancelar");
        btnCancelar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnCancelarActionPerformed(evt);
            }
        });

        txtContraseña.setText("jPasswordField1");

        cmbTipoUsuario.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "Administrador", "Gerente de Ventas", "Encargado de Bodega", "Vendedor", "Cajero" }));

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
        this.setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addGap(264, 264, 264)
                .addComponent(jLabel1)
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                .addContainerGap(149, Short.MAX_VALUE)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                        .addComponent(jLabel2)
                        .addGap(26, 26, 26)
                        .addComponent(cmbNombreUsuario, javax.swing.GroupLayout.PREFERRED_SIZE, 200, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addGap(204, 204, 204))
                    .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                            .addGroup(layout.createSequentialGroup()
                                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                                    .addComponent(jLabel4)
                                    .addComponent(Rol))
                                .addGap(28, 28, 28)
                                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                                    .addComponent(txtContraseña, javax.swing.GroupLayout.DEFAULT_SIZE, 200, Short.MAX_VALUE)
                                    .addComponent(cmbTipoUsuario, 0, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)))
                            .addGroup(layout.createSequentialGroup()
                                .addComponent(jLabel3)
                                .addGap(28, 28, 28)
                                .addComponent(txtNuevoNombreUsuario, javax.swing.GroupLayout.PREFERRED_SIZE, 200, javax.swing.GroupLayout.PREFERRED_SIZE)))
                        .addGap(203, 203, 203))
                    .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                        .addComponent(jSeparator1, javax.swing.GroupLayout.PREFERRED_SIZE, 480, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addGap(118, 118, 118))
                    .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                        .addComponent(btnCancelar)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(btnModificarUsuario)
                        .addContainerGap())))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addGap(36, 36, 36)
                .addComponent(jLabel1)
                .addGap(41, 41, 41)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jLabel2)
                    .addComponent(cmbNombreUsuario, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addGap(18, 18, 18)
                .addComponent(jSeparator1, javax.swing.GroupLayout.PREFERRED_SIZE, 10, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(18, 18, 18)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jLabel3)
                    .addComponent(txtNuevoNombreUsuario, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addGap(28, 28, 28)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jLabel4)
                    .addComponent(txtContraseña, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addGap(30, 30, 30)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(Rol)
                    .addComponent(cmbTipoUsuario, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 118, Short.MAX_VALUE)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(btnModificarUsuario)
                    .addComponent(btnCancelar))
                .addContainerGap())
        );
    }// </editor-fold>//GEN-END:initComponents

    private void cmbNombreUsuarioActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_cmbNombreUsuarioActionPerformed
        // TODO add your handling code here:
    }//GEN-LAST:event_cmbNombreUsuarioActionPerformed

    private void txtNuevoNombreUsuarioKeyTyped(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_txtNuevoNombreUsuarioKeyTyped
        //SOLO LETRAS
        char c;
        c = evt.getKeyChar();
        if (!(c < '0' || c > '9')) //if((car<'a' || car>'z') && (car<'A' || car>'Z')) evt.consume();
        {
            evt.consume();
        }
    }//GEN-LAST:event_txtNuevoNombreUsuarioKeyTyped

    //Metodo para modificar los datos ingresados
    private void btnModificarUsuarioActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnModificarUsuarioActionPerformed

        //Variables que contendran los valores de los campos de texto 
        String nombreUsuario = "";         
        String contraseña = "";
        String tipousuario = "";
        
        int op = 0;
        //Variable que maneja la respuesta del JOptionpane
        int conf;
//Extrayendo la informacion de los campos de texto
        nombreUsuario = txtNuevoNombreUsuario.getText();
        contraseña = txtContraseña.getText();
        tipousuario = cmbTipoUsuario.getSelectedItem().toString();
        
        //Validaciones
        if (!(nombreUsuario.isEmpty() || contraseña.isEmpty() || tipousuario.isEmpty())) { //Si no esta vacio algun campo           

            //Chunche de Hibernate (Inicio de sesion de hibernate)
            Session session = null;
            try {
                try {
                    //Conexion a la BD
                    sessionFactory = ConexionHibernate.getSessionFactory();
                    //Apertura de la sesion
                    session = sessionFactory.openSession();
                    Transaction tx = session.beginTransaction();

                    //Extrayendo el regitro del usuario seleccionado en  base al ID guardado previamente de manera global
                    Usuario usuario = (Usuario) session.get(Usuario.class, id);

                    //Ingresando la nueva informacion del usuario al objeto Usuario
                    usuario.setNombreUsuario(nombreUsuario);
                    usuario.setPassword(contraseña);
                    usuario.setTipoUsuario(tipousuario);

                    //Mensaje de pregunta si quiere guardar los datos proporcionados 
                    conf = JOptionPane.showConfirmDialog(null, "¿Esta seguro de ingresar esos datos?", "Confirmación", JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE);

                    if (conf == JOptionPane.YES_OPTION) {//Si la opcion fue SI
                        //Actualiza los datos del usuario
                        session.update(usuario);
                        txtNuevoNombreUsuario.setText("");
                        txtContraseña.setText("");
                        cmbTipoUsuario.setSelectedIndex(op);
                        tx.commit();
                        //Mensaje de confirmacion de insercion Exitosa
                        JOptionPane.showMessageDialog(null, "Registro guardado exitosamente", "Información", JOptionPane.INFORMATION_MESSAGE);

                    }
                    switch (op) {
                        case 0:
                            if (tipousuario == ("administrador")) {
                                cmbTipoUsuario.addItem(0);
                            }
                            ;
                            break;
                        case 1:
                            if (tipousuario == ("Gerente de Ventas")) {
                                cmbTipoUsuario.addItem(1);
                            }
                            break;
                        case 2:
                            if (tipousuario == ("Encargado de Bodega")) {
                                cmbTipoUsuario.addItem(2);
                            }
                            break;
                        case 3:
                            if (tipousuario == ("Vendedor")) {
                                cmbTipoUsuario.addItem(3);
                            }
                            break;

                        case 4:
                            if (tipousuario == ("Cajero")) {
                                cmbTipoUsuario.addItem(4);
                            }
                            break;

                        default:
                            break;

                    }

                } catch (Exception e) {
                    System.out.println(e.getMessage());
                }
            } finally {
                //Finalizacion de la sesion de hibernate
                session.close();
                //Se vuelve a cargar el comboBox
                cargarComboBox();
            }
        } else {//Si hay campos vacios, mensaje de error
            JOptionPane.showMessageDialog(null, "Error, no pueden haber campos vacios", "Error en los datos", JOptionPane.ERROR_MESSAGE);
        }

    }//GEN-LAST:event_btnModificarUsuarioActionPerformed

    //Metodo que selecciona los datos del proveedor seleccionado del
    //comboBox para ponerlos en los campos de texto
    private void cmbNombreUsuarioItemStateChanged(java.awt.event.ItemEvent evt) {//GEN-FIRST:event_cmbNombreUsuarioItemStateChanged

        String nombreUsuario = "";
        String tipousuario = "";
        List<Usuario> Lusuario = null;
        
        //Se extrae el usuario seleccionado
        nombreUsuario = cmbNombreUsuario.getSelectedItem().toString();

        if (nombreUsuario.equalsIgnoreCase("<--Seleccione un usuario-->")) {
            JOptionPane.showMessageDialog(null, "Seleccione nombre de Usuario", "Selección de datos", JOptionPane.ERROR_MESSAGE);
        } else {
            //Chunche de Hibernate (Inicio de sesion de hibernate)
            Session session = null;
            //Cadena de seleccion de HQL
            String hql = "FROM lemar.entidad.Usuario AS usuario WHERE usuario.nombreUsuario = :nombreUsuario";
            //String hql1 = "FROM lemar.entidad.Usuario AS tipousuario WHERE usuario.tipoUsuario = :tipoUsuario";

            try {
                try {
                    //Conexion a la BD
                    sessionFactory = ConexionHibernate.getSessionFactory();
                    //Apertura de la sesion
                    session = sessionFactory.openSession();
                    Transaction txt = session.beginTransaction();

                    //Extraccion de los datos del proveedor de la BD en base al nombre proporcionado                    
                    Query query = session.createQuery(hql).setString("nombreUsuario", nombreUsuario);
                    
                    //Se pone en una lista el registro sacado
                    Lusuario = query.list();
                   
                    //Guardando el id del usuario en una variable global
                    id = Lusuario.get(0).getIdUsuario();
                    
                    //Se ponen los valores en los campos de texto correspondientes para que se modifiquen
                    //Se ponen los valores en los campos de texto correspondientes para que se modifiquen
                    txtNuevoNombreUsuario.setText(Lusuario.get(0).getNombreUsuario());
                    txtContraseña.setText(Lusuario.get(0).getPassword());
                    
                    //habilitando campos de texto para edicion 
                    txtNuevoNombreUsuario.setEditable(true);
                    txtContraseña.setEditable(true);
                    cmbTipoUsuario.setEnabled(true);
                     txt.commit();


                } catch (Exception e) {
                    System.out.println(e.getMessage());
                }

            } finally {
                //Finalizacion de la sesion de hibernate
                session.close();
            }
        }


    }//GEN-LAST:event_cmbNombreUsuarioItemStateChanged

    private void btnCancelarActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnCancelarActionPerformed

        
        //Se borran los datos previos de los campos de texto
        txtNuevoNombreUsuario.setText("");
        txtContraseña.setText("");
       
        //Deshabilitando edicion
        txtNuevoNombreUsuario.setEditable(false);
        txtContraseña.setEditable(false);
         cmbTipoUsuario.setEnabled(false);

    }//GEN-LAST:event_btnCancelarActionPerformed

    //Metodo para cargar el comboBox dinamicamente de la BD
    private void cargarComboBox() {

        //Obtencion de todos los usuarios de la base de datos para llenar el comboBox de manera dinamica
        //Variable que contendra la lista de usuarios
        List<Usuario> listaUsuario = null;
        
        //Inicializacion de session de hibernate
        Session session = null;
        try {
            try {
                //Chunces que ocupa Hibernate
                sessionFactory = ConexionHibernate.getSessionFactory();
                session = sessionFactory.openSession();
                Transaction tx = session.beginTransaction();

                //Obteniendo de la BD todos los usuarios                
                listaUsuario = session.createQuery("from Usuario").list();

                //Creando un modelo de comboBox                
                DefaultComboBoxModel modeloCombo = new DefaultComboBoxModel();
                DefaultComboBoxModel dcbm = new DefaultComboBoxModel();

                //Poniendole un mensaje de seleccion (Pirmer elemento)
                modeloCombo.addElement("<-Seleccione un Usuario->");
                //dcbm.addElement("<-Seleccione un Rol->");
                //Llenando el modelo de comboBox con los nombres de los usuarios

                for (Usuario usuario : listaUsuario) {
                    modeloCombo.addElement(usuario.getNombreUsuario());
                    dcbm.addElement(usuario.getTipoUsuario());


                }
                //Agregando el modelo del comboBox al comboBox del panel
                cmbNombreUsuario.setModel(modeloCombo);
                cmbTipoUsuario.setModel(dcbm);

            } catch (Exception e) {
                System.out.println(e.getMessage());
            }
        } finally {
            session.close();
        }

    }
    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JLabel Rol;
    private javax.swing.JButton btnCancelar;
    private javax.swing.JButton btnModificarUsuario;
    private javax.swing.JComboBox cmbNombreUsuario;
    private javax.swing.JComboBox cmbTipoUsuario;
    private javax.swing.JLabel jLabel1;
    private javax.swing.JLabel jLabel2;
    private javax.swing.JLabel jLabel3;
    private javax.swing.JLabel jLabel4;
    private javax.swing.JSeparator jSeparator1;
    private javax.swing.JPasswordField txtContraseña;
    private javax.swing.JTextField txtNuevoNombreUsuario;
    // End of variables declaration//GEN-END:variables
}
